/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.support;

import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.core.AliasRegistry;

/**
 *
 * 持有 bean 定义的注册表的接口，例如 RootBeanDefinition 和 ChildBeanDefinition 实例。
 * 通常由在内部使用 AbstractBeanDefinition 层次结构的 beanFactory 实现。
 *
 * 这是spring 的 bean factory 包中唯一封装bean定义注册的接口。
 * 标准的beanFactory接口仅仅涵盖对完全配置的工厂的工厂实例的访问。
 *
 * spring的beanDefinitionReader 期待作用于该接口的实现。
 * spring中已经有的实现是  DefaultListableBeanFactory  GenericApplicationContext 。
 *
 */
public interface BeanDefinitionRegistry extends AliasRegistry {


	 /*注册一个bean的定义信息，支持指定bean的名字*/
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

	/*根据bean的名字移除掉已经注册的beanDefinition*/
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/*根据名字查找BeanDefinition*/
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
	/*判断是否包含给定名字的BeanDefinition信息*/
	boolean containsBeanDefinition(String beanName);
	/*返回已经注册的BeanDefinition名字列表*/
	String[] getBeanDefinitionNames();
	/*返回已经注册的BeanDefinition数量*/
	int getBeanDefinitionCount();

	/*确定给定的bean名称是否已经在注册中心使用， 怎么判断是否使用呢？就是是否有别名注册在此名称下，或者已经有注册在这里的bean。*/
	boolean isBeanNameInUse(String beanName);

}
